GtkFileChooserNativeQuartz: restore parent focus after closing dialog
authorTom Schoonjans <Tom.Schoonjans@diamond.ac.uk>
Mon, 31 Jul 2017 20:28:42 +0000 (21:28 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 23 Aug 2017 14:45:30 +0000 (10:45 -0400)
Tested for both modal and non-modal dialogs

https://bugzilla.gnome.org/show_bug.cgi?id=785306

gtk/gtkfilechoosernativequartz.c

index f210c1db94e919da17739818df4567cdfe6af4c3..65f2579b903003043c31a0addd32a075148888f0 100644 (file)
@@ -48,6 +48,7 @@ typedef struct {
 
   NSSavePanel *panel;
   NSWindow *parent;
+  NSWindow *key_window;
   gboolean skip_response;
   gboolean save;
   gboolean folder;
@@ -350,6 +351,16 @@ filechooser_quartz_launch (FileChooserQuartzData *data)
 
     self->mode_data = NULL;
 
+    if (data->parent)
+      {
+        [data->panel orderOut:nil];
+        [data->parent makeKeyAndOrderFront:nil];
+      }
+    else
+      {
+        [data->key_window makeKeyAndOrderFront:nil];
+      }
+
     if (!data->skip_response)
       {
         g_slist_free_full (self->custom_files, g_object_unref);
@@ -365,12 +376,10 @@ filechooser_quartz_launch (FileChooserQuartzData *data)
 
   if (data->parent != NULL && data->modal)
     {
-      [data->panel setLevel:NSModalPanelWindowLevel];
       [data->panel beginSheetModalForWindow:data->parent completionHandler:handler];
     }
   else
     {
-      [data->panel setLevel:NSModalPanelWindowLevel];
       [data->panel beginWithCompletionHandler:handler];
     }
 
@@ -543,6 +552,8 @@ gtk_file_chooser_native_quartz_show (GtkFileChooserNative *self)
         data->current_name = g_strdup (self->current_name);
     }
 
+  data->key_window = [NSApp keyWindow];
+
   return filechooser_quartz_launch(data);
 }
 
@@ -560,8 +571,15 @@ gtk_file_chooser_native_quartz_hide (GtkFileChooserNative *self)
 
   [data->panel orderBack:nil];
   [data->panel close];
+
   if (data->parent)
-    [data->parent orderFront:nil];
+    {
+      [data->parent makeKeyAndOrderFront:nil];
+    }
+  else
+    {
+      [data->key_window makeKeyAndOrderFront:nil];
+    }
   data->panel = NULL;
 }